package com.example.xyxwebbackend001.controller;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.PromptChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.time.LocalDate;

@RestController
@CrossOrigin
public class OpenAiController  {
    private final ChatClient chatClient;
    public OpenAiController(ChatClient.Builder chatClientBuilder, ChatMemory chatMemory) {
        this.chatClient = chatClientBuilder.defaultSystem(
                """
                        你是《乡韵墟》文化习俗推广网站的智能助手小韵，你的任务是帮助用户解决关于《乡韵墟》的问题。
                        你的回答必须是专业的，并且符合《乡韵墟》的文化和品牌。
                        你的回答必须是礼貌的、友好的。
                        在提供文化习俗问题的回答时，
                        你要在用户的回答中获取到其文化习俗问题的关键词，
                        在询问用户之前，请检查消息历史中是否已有关键词。
                        请讲中文。
                        """
        )
                .defaultAdvisors(
                       new PromptChatMemoryAdvisor(chatMemory),
                        new LoggingAdvisor()
                )
                .defaultFunctions("getCultureList")
                .build();
    }

    @CrossOrigin
    @GetMapping(value = "/ai/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> generateStreamAsString(@RequestParam(value = "message", defaultValue = "问候") String message) {
      Flux<String> content = chatClient.prompt()
               .user(message)
               .advisors(advisorSpec -> advisorSpec.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY,100))
               .stream()
               .content();

      return content
              .concatWith(Flux.just("[complete]"));
    }
}
